package ThreadCase;

import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.FutureTask;

public class Demo3 {
    /**
     * 多线程第三种启动方式
     * 特点：可以获取到多线程的执行结果
     * 1.自己定义一个类实现Callable接口,并提供返回值类型(泛型的位置)
     * 2.重写call()方法(是有返回值的，表示多线程运行的结果)
     * 3.创建FutureTask对象(作用管理多线程的结果)
     * 4.创建Thread类的对象，并启动（表示线程）
     */
    public static void main(String[] args) {
        //实例化我们定义的对象
        Case case1=new Case();
        //创建FutreTask对象(作用管理多线程的结果)
        //注意泛型的类型要一致
        //ft1与ft2用于管理线程1和2的结果
        FutureTask<String> ft1=new FutureTask<>(case1);
        FutureTask<String> ft2=new FutureTask<>(case1);

        Thread t1=new Thread(ft1,"线程1");
        Thread t2=new Thread(ft2,"线程2");
        t1.start();//启动线程1
        t2.start();//启动线程2

        //获取多线程运行的结果 记得要捕获一下异常
        try {
            //获取多线程运行结果并打印
            String result1= ft1.get();
            String result2= ft2.get();
            System.out.println(result1);
            System.out.println(result2);
        } catch (InterruptedException e) {
            throw new RuntimeException(e);
        } catch (ExecutionException e) {
            throw new RuntimeException(e);
        }
    }
    //自己定义一个类实现Callable接口
    //我这边用返回值设置为String
    public static class Case implements Callable<String> {
        @Override
        public String call() throws Exception {
            //求1~100之间的和
            int sum=0;
            for (int i = 1; i <=100 ; i++) {
                sum+=i;//子增加i
            }
            //返回当前线程的名称+最终求和结果
            return Thread.currentThread().getName()+":"+sum;
        }
    }

}
